//
//  WBNetworkManager.swift
//  传智微博
//
//  Created by zuxi li on 2017/3/17.
//  Copyright © 2017年 lingtu. All rights reserved.
//

import UIKit
import AFNetworking        // 导入框架的文件夹的名字


/// swift枚举支持任意类型
enum WBHTTPMethod {
    case GET
    case POST
}
/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {

    /// 静态区/常量/闭包
    // 在第一次访问时执行闭包，并且将结果保存在shared中
//    static let shared = WBNetworkManager()
    static let shared: WBNetworkManager = {
       let instance = WBNetworkManager()
        // 设置相应的反序列化支持的数据格式
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        return instance
    }()
    
//    /// 访问令牌， 所有网络请求，都基于
////    var accessToken: String? = "2.006qtdcFiHOobDf42e3d01b90R5pqZ"
//    var accessToken: String? //= "2.006qtdcFu7veVE3fd1a4af42qydk1D"
//    // 用户的微博 id
//    var uid: String? = "5365823342"
    
    /// 微博账户懒加载属性
    lazy var userAccont = WBUserAccount()
    
    // 计算型属性
    var userLogon: Bool {
        return userAccont.access_token != nil
//        return userAccont.accessToken != nil
    }
    /// 使用一个函数封装AFN的GET和POST请求此令牌（登录除外）
    
    
    /// 专门负责拼接 token 的网络请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组)， 是否成功]
    func tokenRequest(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: Any?, _ isSuccess: Bool)->()) {
        // 处理token字典
//        let params = ["access_token": "2.006qtdcFiHOobDf42e3d01b90R5pqZ"]
        // 判断token是否为nil， 为nil直接返回, 程序执行过程中token一般不会为nil
        guard let token = userAccont.access_token else {
            print("没有token需要登录")
            //发送通知提示用户登录
            
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
            
            completion(nil, false)
            return
        }
        // 1.判断参数字典是否存在， 如果为nil应该新建一个字典
        var parameters = parameters
        if parameters == nil {
            parameters = [String: AnyObject]()
        }
        // 设置参数字典, 代码在此处字典一定有值
        parameters!["access_token"] = token as AnyObject?
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    
    
    /// 封装 AFN 的 GET/POST 请求
    ///
    /// - Parameters:
    ///   - method: GET/POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[json(字典/数组)， 是否成功]
    func request(method: WBHTTPMethod = .GET, URLString: String, parameters: [String: AnyObject]?, completion:@escaping (_ json: Any?, _ isSuccess: Bool)->()) {
        
        // 成功回调
        let success = {
            (task: URLSessionDataTask, json: Any?) -> () in
            completion(json, true)
        }
        // 失败回调
        let failure = {
            (task: URLSessionDataTask?, error: Error) -> () in
            // 针对403 处理用户token过期
            // 未审核的token不可用试可以重新申请一个程序
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("token过期了")
                // 发送通知，提示用户再次登录 本方法不知道被谁调用，谁接收到通知谁处理
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: "bad token")
            }
            print("网络请求错误: \(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }

        
    }
}
